/**
 * <copyright>
 * Copyrigth 2007 Aurelien Moreau
 *
 * This file is part of ProcessShop.
 *
 * ProcessShop is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * ProcessShop is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with ProcessShop; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 * </copyright>
 *
 * $Id$
 */
package net.yienyien.process.folder.componentizer.impl;

import java.util.ArrayList;

import net.yienyien.process.bpd.BPDComponent;
import net.yienyien.process.bpd.BPDObject;
import net.yienyien.process.folder.artifacts.BPDPattern;
import net.yienyien.process.folder.artifacts.PatternedBPDComponent;
import net.yienyien.process.folder.componentizer.BPDComponentizer;
import net.yienyien.process.folder.componentizer.BPDComponentizerListener;

import org.eclipse.emf.common.util.EList;

public class BPDComponentizerImpl implements BPDComponentizer, BPDComponentizerListener{

	protected ArrayList<BPDPattern> patterns;
	protected ArrayList<BPDComponentizerListener> listeners;
	
	public BPDComponentizerImpl() {
		patterns=new ArrayList<BPDPattern>();
	}
	
	@Override
	public void addListerner(BPDComponentizerListener listener) {
		listeners.add(listener);
	}

	@Override
	public void removeListerner(BPDComponentizerListener listener) {
		listeners.remove(listener);
	}
	
	@Override
	public PatternedBPDComponent findComponent(EList<BPDObject> activeObjects) {
		for(BPDPattern pattern: patterns) {
			PatternedBPDComponent component=pattern.find(activeObjects);
			if(component!=null) {
				/*
				System.out.println(component.getPattern()+" {");
				for(BPDObject o: component.getObjects()) {
					System.out.println("\t"+o.getFrom().toString());
				}
				System.out.println("}");
				*/
				return component;
			} 
		}
		
		assert(false);
		return null;
	}

	public void addPattern(BPDPattern pattern) {
		patterns.add(pattern);
	}
	
	public void removePattern(BPDPattern pattern) {
		patterns.remove(pattern);
	}

	@Override
	public void findComponent(BPDPattern pattern, BPDComponent component) {
		for(BPDComponentizerListener l: listeners) {
			l.findComponent(pattern, component);
		}
	}

	@Override
	public void noComponent(BPDPattern pattern, BPDComponent component) {
		for(BPDComponentizerListener l: listeners) {
			l.noComponent(pattern, component);
		}
	}

}
